package com.xx.springboot.DataStructure.LeetCode.String;


/**

     报数序列是指一个整数序列，按照其中的整数的顺序进行报数，得到下一个数。其前五项如下：

     1.     1
     2.     11
     3.     21
     4.     1211
     5.     111221
     1 被读作  "one 1"  ("一个一") , 即 11。
     11 被读作 "two 1s" ("两个一"）, 即 21。
     21 被读作 "one 2",  "one 1" （"一个二" ,  "一个一") , 即 1211。

     给定一个正整数 n ，输出报数序列的第 n 项。

     注意：整数顺序将表示为一个字符串。

     示例 1:

     输入: 1
     输出: "1"
     示例 2:

     输入: 4
     输出: "1211"
 */
public class countAndSay {
    public String countAndSay(int n) {
        String res = "1";
        for (int i = 1; i < n ; i++) {
            System.out.println(res);
            res = subCountAndSayString(res);
        }
        return res;
    }


    public String subCountAndSayString(String str){
        StringBuffer res = new StringBuffer();
        boolean mark = true;
        int index = 0, count = 1;
        for (int i = 0 ; i < str.length(); i++) {
            if (i + 1 == str.length() && mark) {
                res.append(1).append(str.substring(i, i + 1));
                return res.toString();
            }

            if (str.charAt(i) == str.charAt(i + 1)) {
                mark = false;
                count++;

                if (i + 2 == str.length()) {
                    res.append(count).append(str.substring(i, i + 1));
                    break;
                }

            } else if (str.charAt(i) != str.charAt(i + 1)) {
                if(mark){
                    res.append(1).append(str.substring(i, i + 1));
                }
                else {
                    res.append(count).append(str.substring(i, i + 1));
                    mark = true;
                    count = 1;
                }
            }
        }
        return res.toString();
    }

    public static void main(String[] args) {
        System.out.println((new countAndSay()).countAndSay(6));
    }
}
